/**
 * 发布订阅模式 (Pub-Sub Pattern)
 * 事件发射器类，用于实现发布订阅模式
 */
class EventEmitter {
  /**
   * 构造函数
   * 初始化事件存储
   */
  constructor() {
    // TODO: 初始化事件存储
    // 提示：使用Map或Object来存储事件和对应的回调函数列表
  }

  /**
   * 订阅事件
   * @param {string} eventName - 事件名称
   * @param {Function} callback - 回调函数
   */
  on(eventName, callback) {
    // TODO: 实现事件订阅功能
    // 提示：将回调函数添加到对应事件的回调列表中
  }

  /**
   * 发布事件
   * @param {string} eventName - 事件名称
   * @param {...any} args - 传递给回调函数的参数
   */
  emit(eventName, ...args) {
    // TODO: 实现事件发布功能
    // 提示：遍历对应事件的所有回调函数并执行
  }

  /**
   * 取消订阅
   * @param {string} eventName - 事件名称
   * @param {Function} callback - 要移除的回调函数
   */
  off(eventName, callback) {
    // TODO: 实现取消订阅功能
    // 提示：从对应事件的回调列表中移除指定的回调函数
  }

  /**
   * 一次性订阅
   * @param {string} eventName - 事件名称
   * @param {Function} callback - 回调函数
   */
  once(eventName, callback) {
    // TODO: 实现一次性订阅功能
    // 提示：订阅后自动取消，只执行一次
  }

  /**
   * 获取所有事件名称
   * @returns {string[]} 所有已注册的事件名称数组
   */
  eventNames() {
    // TODO: 返回所有已注册的事件名称
  }

  /**
   * 获取指定事件的监听器数量
   * @param {string} eventName - 事件名称
   * @returns {number} 监听器数量
   */
  listenerCount(eventName) {
    // TODO: 返回指定事件的监听器数量
  }
}

module.exports = EventEmitter
